﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using CrystalDecisions.CrystalReports.Engine;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;
using System.Configuration;
using CrystalDecisions.Shared;

namespace GSQ.WebService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService
    {
        public Service1()
        {
            this.rpt = new ReportDocument();      
        }

        private SYSTEM_CONFIG systemConfig = new SystemConfigBL().Get();
        private string DbName = ConfigurationManager.AppSettings.Get("DbName");
        private string DbUser = ConfigurationManager.AppSettings.Get("DbUser");
        private string DbServer = ConfigurationManager.AppSettings.Get("DbServer");
        private string DbPassWord = ConfigurationManager.AppSettings.Get("DbPassWord");
        private string ReportName;
        ReportDocument rpt;

        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }

        public ReportDocument GetRepCompra(decimal id)
        {
            ReportName = "Inv-07";
            this.rpt.Load(systemConfig.RUTA_REPORTES + ReportName + ".rpt");
            this.rpt.SetParameterValue("paramId", id);
            this.Login();

            return rpt;
        }

        public ReportDocument GetRepFacturaCarta(decimal id)
        {
            ReportName = "fac-00";
            this.rpt.Load(systemConfig.RUTA_REPORTES + ReportName + ".rpt");
            rpt.SetParameterValue("paramIdFactura", id);
            this.Login();
         
            return rpt;
        }

        public void PrintFcaturaTicket(decimal id)
        {
            FACTURAS f = new FacturasBL().GetById(id);
            if (f != null)
            {
                UTILIDADES u = new UtilidadesBL().Get();
                f.USUARIOS = new USUARIOS { NOMBRE = "USUARIO", APELLIDO = "GENERAL" };
                const int MaxCaracteres = 40;
                StringBuilder sb = new StringBuilder();

                if (u.NOMBRE_CIA.Length > MaxCaracteres)
                    sb.AppendLine(u.NOMBRE_CIA.Substring(0, MaxCaracteres));
                else
                    sb.AppendLine(u.NOMBRE_CIA);

                if (u.DIRECCION.Length > MaxCaracteres)
                    sb.AppendLine(u.DIRECCION.Substring(0, MaxCaracteres));
                else
                    sb.AppendLine(u.DIRECCION);

                sb.AppendLine(string.Format("Tel.:{0} Fax.:{1}", u.TELEFONO1, u.FAX));
                sb.AppendLine(string.Format("Rnc.:{0}", u.RNC));
                sb.AppendLine("");

                if (f.CLIENTES.CLIENTE.Length > MaxCaracteres)
                    sb.AppendLine(string.Format("Cli.:{0}", f.CLIENTES.NOMBRE_COMERCIAL.Substring(0, MaxCaracteres)));
                else
                    sb.AppendLine(string.Format("Cli.:{0}", f.CLIENTES.CLIENTE));

                sb.AppendLine(string.Format("Factura.:{0} {1}", f.NRO_FACTURA, f.CONDICIONES.CONDICION));
                sb.AppendLine(string.Format("Fecha/Hora.:{0} {1}", f.FECHA_HORA.Date.ToString("dd/MM/yyyy"), f.FECHA_HORA.ToShortTimeString()));
                sb.AppendLine(TicketLine());
                sb.AppendLine("COD/CANT  PRECIO/DESCRIPCION     IMPORTE");
                sb.AppendLine(TicketLine());
                decimal subTotal = 0;
                int count = 0;
                foreach (FACTURAS_DETALLES fd in f.FACTURAS_DETALLES)
                {
                    subTotal += fd.SUB_TOTAL_X_PRECIO;
                    string cod = fd.PRODUCTOS.CODIGO;
                    string cant = fd.CANTIDAD.ToString("N");
                    string desc = fd.DESCRIPCIONES.DESCRIPCION;
                    string subt = fd.SUB_TOTAL_X_PRECIO.ToString("N2");
                    string precio = fd.PRECIO.ToString("N2");
                    cant = cant.PadRight(9);
                    if (desc.Length > 20)
                        desc = desc.Substring(0, 20);
                    else
                        desc = desc.PadRight(20);

                    sb.AppendLine(string.Format("{0} {1}", cod, precio));
                    subt = subt.PadLeft(9);
                    string li = string.Format("{0} {1} {2}", cant, desc, subt);
                    sb.AppendLine(li);
                    count++;
                }
                sb.AppendLine(TicketLine());
                sb.AppendLine(string.Format("Articulos facturados {0}", count.ToString()));
                sb.AppendLine(string.Format("{0} {1}", "Sub Total".PadLeft(29), subTotal.ToString("N2").PadLeft(10)));
                sb.AppendLine(string.Format("{0} {1}", "Descuetos".PadLeft(29), f.T_DESCUENTO.ToString("N2").PadLeft(10)));
                sb.AppendLine(string.Format("{0} {1}", u.NOMBRE_IMPUESTO.PadLeft(29), f.T_IMPUESTO.ToString("N2").PadLeft(10)));
                sb.AppendLine(string.Format("{0} {1}", "Total Gral.".PadLeft(29), f.M_TOTAL.ToString("N2").PadLeft(10)));
                sb.AppendLine("");
                if (f.ID_NCF == 1)
                    sb.AppendLine("CONSUMIDOR FINAL");
                else
                    sb.AppendLine(f.NCF.DESCRIPCION);
                sb.AppendLine(string.Format("Ncf.:{0}{1}", f.NCF.NCF1, f.SEQ_NCF.ToString("00000000")));
                sb.AppendLine("");

                if ((f.USUARIOS.NOMBRE + " " + f.USUARIOS.APELLIDO).Length > MaxCaracteres)
                    sb.AppendLine(string.Format("Le antendio.:{0}", (f.USUARIOS.NOMBRE + " " + f.USUARIOS.APELLIDO).Substring(0, 40)));
                else
                    sb.AppendLine(string.Format("Le antendio.:{0}", (f.USUARIOS.NOMBRE + " " + f.USUARIOS.APELLIDO).ToString()));
                sb.AppendLine("");
                sb.AppendLine("NO ACEPTAMOS DEVOLUCIONES!!");
                sb.AppendLine("De ningun tipo de partes electricas");
                sb.AppendLine("Ni de piezas vendidas correctamente");
                sb.AppendLine("");
                sb.AppendLine("GRACIAS POR TU VISITA");
                sb.AppendLine("");
                sb.AppendLine("");
                sb.AppendLine("");
                sb.AppendLine("");
                sb.AppendLine("");
                RawPrinterHelper.SendStringToPrinter(systemConfig.PRINTER_NAME_CONTADO, sb.ToString());

            }
            else
            {
                throw new Exception("No hay factura con este ID");
            }

        }

        private string TicketLine()
        {
            string l = string.Empty;
            for (int i = 0; i <= 39; i++)
            {
                l = l + '=';
            }
            return l;
        }

        private void Login()
        {
            foreach (IConnectionInfo cn in rpt.DataSourceConnections)
            {
                cn.SetLogon(DbUser, DbPassWord);
                cn.SetConnection(DbServer, DbName, false);
            }
        }
    }
}
